[Android] Getting Started (2)

Android developer site study

  • Getting Started
    • Building Your First App
    • Supporting Different Devices
    • Building a Dynamic UI with Fragments
    • Saving Data
    • Interacting with Other Apps
    • Working with System Permissions
https://developer.android.com/training/index.html

다양한 언어의 지원

Locale 디렉토리 및 문자열 파일 생성

더 많은 언어를 지원하기 위해서는 추가 values 디렉토리를 생성해야 한다. 이 때 디렉토리 이름 끝에 하이픈과 ISO 언어 코드를 포함하여 res/ 디렉토리 아래 생성한다.

예를 들면, values-es/는 언어 코드가 “es”인 locale의 리소스를 포함하는 디렉토리이다.

지원할 언어를 결정하고 나면 리소스 하위 디렉토리 및 문자열 리소스 파일을 생성한다.

MyProject/
res/
values/
strings.xml
values-kr/
strings.xml
values-fr/
strings.xml

문자열 리소스 사용

<string> 요소의 name 특성으로 정의된 리소스 이름을 사용하여 소스 코드 및 다른 XML 파일에서 문자열 리소스를 참조할 수 있다.

소스 코드 구문에서 참조

R.string.<string_name>을 사용하여 문자열 리소스를 참조.

1
2
3
4
5
6
// App의 리소스로부터 string 리소스를 가져오기
String hello = getResources().getString(R.string.hello_world);
// 메서드가 요구하는 string을 string 리소스로 제공
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

다른 XML 파일에서 참조

@string/<string_name>을 사용하여 문자열 리소스를 참조

1
2
3
4
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

다양한 화면의 지원

Android는 sizedensity 두 가지의 프로퍼티를 사용하여 장치의 화면을 분류한다.

따라서 다양한 화면 크기 및 해상도에 최적화하기 위해 대체 리소스를 준비해야 한다.

  • 일반적으로 사용하는 네 가지 size
    • small, normal, large, xlarge
  • 일반적으로 사용하는 네 가지 density
    • low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)

다양한 화면을 지원하기 위한 레이아웃과 비트맵은 분리된 디렉토리에 위치시켜야 한다. 이는 앞에서 보았던 언어 별 문자열을 나눈 것과 비슷하다.

화면 방향 (landscape 또는 portrait) 또한 고려해야 한다. 많은 App들이 화면 방향에 따라 서로 다른 사용자 경험을 제공하고 있다.

다른 레이아웃의 생성

서로 다른 화면 크기에 대한 사용자 경험을 최적화하기 위해 각 화면 크기에 맞는 고유한 레이아웃 XML 파일을 생성해야 한다.

각 레이아웃은 올바른 리소스 디렉토리에 저장해야 하며 접미사로 -<screen_size>를 사용한다. 예를 들어 large screen에 대한 레이아웃은 res/layout-large/에 저장해야 한다.

Android는 자동으로 레이아웃의 비율을 조정하여 화면에 맞춰준다. 그리하여 개발자는 절대적인 크기에 연연할 필요가 없고 레이아웃 구조에 대해 더 신경써야 한다.

예를 들어, 이 프로젝트가 기본 레이아웃과 large screen을 위한 레이아웃을 가지고 있다고 하면 아래와 같은 구조를 갖는다.

MyProject/
res/
layout/
main.xml
layout-large/
main.xml

파일 이름은 완전히 같아야 한다.

레이아웃 파일은 app 내에서 일반적으로 아래와 같이 참조한다.

1
2
3
4
5
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

App이 시행되면 시스템은 화면 크기에 맞는 적당한 레이아웃 디렉토리로부터 레이아웃 파일을 읽어온다.

또 다른 예로, landscape 방향을 위한 레이아웃은 아래와 같이 사용할 수 있다.

MyProject/
res/
layout/
main.xml
layout-land/
main.xml

layout/main.xml 파일의 기본 값은 portrait 방향이다.

large와 landscape를 모두 사용할 경우 아래와 같이 구성한다.

MyProject/
res/
layout/
main.xml
layout-land/
main.xml
layout-large/
main.xml
layout-large-land/
main.xml

서로 다른 비트맵 생성

개발자는 일반적인 해상도들(low, medium high, extra-high)에 맞춘 적절한 비트맵 리소스들을 준비해 두어야 한다.

이러한 이미지들을 생성하기 위해 raw 리소스를 vector format으로 시작하고 아래의 해상도에 맞는 각각의 이미지를 생성해야 한다.

  • xhdpi: 2.0
  • hdpi: 1.5
  • mdpi: 1.0 (baseline)
  • ldpi: 0.75

이것의 의미는 xhdpi 기기를 위해 200x200 이미지를, hdpi 기기를 위해 150x150 이미지를, mdpi 기기를 위해 100x100 이미지를, ldpi 기기를 위해 75x75 이미지를 준비해야 한다는 것이다.

그 후 각각의 drawable 리소스 디렉토리에 위치시킨다.

MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png

이 파일의 참조는 @drawable/awesomeimage 의 방식으로 할 수 있다. 그러면 시스템이 알아서 화면 해상도에 맞는 이미지를 찾아줄 것이다.

Low-density(ldpi) 리소스는 꼭 필요한 것은 아니다. 개발자가 hdpi 리소스들만 준비해 둔다면 시스템은 해상도를 조정하여 ldpi 화면에 맞춰줄 것이다.

서로 다른 플랫폼 버전의 지원

최신 버전의 Android에서는 새로운 API들을 지원하기 때문에 이전 버전의 Android를 업데이트 해야한다.

각각의 Android 버전에서 최상의 기능을 지원하기 위해서 Android Support Library를 사용하는 것을 추천한다.
이를 사용하여 이전 버전의 Android App에서도 최신 플랫폼 API를 사용할 수 있게 된다.

Minimum API level 및 Target API level 정하기

AndroidManifest.xml 파일에는 App에 대한 정보들에 대해 기술되어 있다. 특별히 minSdkVersiontargetSdkVersion 특성은 <uses-sdk> 요소에 정의된다. 이는 호환을 지원하는 최저 API level과 App이 어떤 버전을 Target으로 하여 제작되었는지를 나타낸다.

예를 들면 아래와 같다.

1
2
3
4
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
...
</manifest>

Android의 새 버전이 릴리즈되면 몇몇의 스타일 및 동작이 달라진다. App이 이러한 변화들을 받아들일 수 있게 하려면 targetSdkVersion에는 꼭 최신 버전을 넣어주는 것이 좋다.

Runtime에 시스템 버전 체크하기

Android는 Build 라는 상수에 각 플랫폼 버전에 대한 고유한 코드를 넣어둔다.

이 코드를 이용하여 특정 API를 현재 App에서 사용할 수 있는지 확인할 수 있다.

1
2
3
4
5
6
7
private void setUpActionBar() {
// Make sure we're running on Honeycomb or higher to use ActionBar APIs
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
}

XML 리소스를 파싱할 때 Android는 현재 기기가 지원하지 않는 XML 특성들을 무시한다. 따라서 새 버전에서만 지원하는 XML 속성들을 안전하게 사용할 수 있다.
예를 들어, targetSdkVersion = “11”로 설정되면 Android 3.0 이상에서는 기본적으로 ActionBar가 App에 포함된다.
Menu item을 ActionBar에 추가하기 위해서는 menu 리소스 XML 파일에 android:showAsAction=”ifRoom” 을 설정해주면 된다.
이 방법은 서로 다른 버전의 XML 파일에서 안전하게 작동하는데 그 이유는 이전 버전의 Android에서는 showAsAction 특성을 무시하기 때문이다. (즉, res/menu-v11/ 내에 별도의 버전이 필요하지 않다는 것이다.)

플랫폼 스타일과 테마 사용하기

Android는 OS에 맞는 look and feel을 위해 App에 테마를 제공한다.

테마는 manifest 파일에서 설정할 수 있다.

이런 내장 스타일과 테마를 사용함으로써 App은 최신 Androrid의 look and feel을 자연스럽게 적용할 수 있게 된다.

Activity를 Dialog box처럼 보이게 하기

<activity android:theme="@android:style/Theme.Dialog">

Activity에 투명 배경으로 만들기

<activity android:theme="@android:style/Theme.Translucent">

/res/values/styles.xml 에 정의한 커스텀 테마 적용하기

<activity android:theme="@style/CustomTheme">

App의 모든 Activity에 테마를 적용하고 싶을 때에는 <application> 요소에 android:theme 특성을 추가한다.

<application android:theme="@style/CustomTheme">

출처

Share